package v1

import "time"

const (
	TaskTypeBatch        = "Batch"        // 批处理任务，对应Job
	TaskTypeService      = "Deployment"   // 持续运行任务，对应Deployment
	TaskTypeShardedBatch = "ShardedBatch" // 分片批处理任务
)

// 定义任务状态常量
const (
	PhasePending     = "Pending" // 待处理的任务
	PhaseRunning     = "Running" // 资源已经创建，但Pod不一定成功运行
	PhaseFailed      = "Failed"
	PhaseAvailable   = "Available"   // 资源可用，表示当前Deploy所有Pod可用，成功运行
	PhaseDegraded    = "Degraded"    // Pod异常
	PhaseSucceeded   = "Succeeded"   // 表示Job任务成功执行完
	PhaseTerminating = "Terminating" // 表示任务正在中止（删除时使用）
	PhaseQueued      = "Queued"      // 表示任务所需资源不足或优先级不够，入队等待
	PhaseReady       = "Ready"       // 表示任务所需资源充足，准备开始运行进入Running状态
)

type TaskSize string

const (
	SizeSmall  TaskSize = "Small"
	SizeMedium TaskSize = "Medium"
	SizeLarge  TaskSize = "Large"
	SizeGPU    TaskSize = "GPU" // 需要 GPU 的特殊规格
)

type TaskMetadata struct {
	Name      string            `yaml:"name" json:"name" validate:"required,hostname_rfc1123,lowercase,max=63"` // 字符串只包含ASCII字母数字字符
	Namespace string            `json:"namespace,omitempty" yaml:"namespace,omitempty"`
	Labels    map[string]string `yaml:"labels,omitempty" json:"labels,omitempty"`
	UID       string            `json:"uid,omitempty" yaml:"uid,omitempty"`
	Team      string            `json:"team,omitempty" yaml:"team,omitempty"` // <-- 新增字段，用于标识任务归属
}

type TaskResources struct {
	CPU    string `yaml:"cpu" json:"cpu"`
	Memory string `yaml:"memory" json:"memory"`
	GPU    string `yaml:"gpu,omitempty" json:"gpu,omitempty"` // omitempty 表示如果为空则不序列化
}

// TaskSpec 定义了任务的期望状态
type TaskSpec struct {
	Type string `json:"type" yaml:"type" validate:"required,oneof=Batch Deployment ShardedBatch"`
	// 定义任务的依赖
	DependsOn  []string        `json:"dependsOn,omitempty" yaml:"dependsOn,omitempty"`
	Execution  *ExecutionSpec  `json:"execution,omitempty" yaml:"execution,omitempty"`
	Scheduling *SchedulingSpec `json:"scheduling,omitempty" yaml:"scheduling,omitempty"`

	// --- 对于 ShardedBatch 类型，Template 和 Parameters 保持不变 ---
	Template   *TaskTemplateSpec   `json:"template,omitempty" yaml:"template,omitempty"`
	Parameters []map[string]string `json:"parameters,omitempty" yaml:"parameters,omitempty"`

	Volumes []VolumeSpec `json:"volumes,omitempty" yaml:"volumes,omitempty" validate:"dive"`
	// 添加 Size 字段，允许用户通过选择一个模糊的范围来确定大小
	Size TaskSize `json:"size,omitempty" yaml:"size,omitempty" validate:"omitempty,oneof=Small Medium Large GPU"`
}

type BaseTask struct {
	APIVersion string       `yaml:"apiVersion" json:"apiVersion" validate:"required,eq=v1"`
	Kind       string       `yaml:"kind" json:"kind" validate:"required,eq=BaseTask"`
	Metadata   TaskMetadata `yaml:"metadata" json:"metadata" validate:"required"`
	Spec       TaskSpec     `yaml:"spec" json:"spec"  validate:"required"`
	Status     TaskStatus   `json:"status,omitempty" yaml:"status,omitempty"`
}

// TaskStatus 代表任务的最后观测状态
type TaskStatus struct {
	Phase          string    `json:"phase" yaml:"phase"`
	Message        string    `json:"message,omitempty" yaml:"message,omitempty"`
	LastUpdateTime time.Time `json:"lastUpdateTime,omitempty" yaml:"lastUpdateTime,omitempty"`
}
